package cn.utils;

import cn.hutool.core.date.DateBetween;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * 类简介: 日期实用程序
 *
 * @Author: ShangGuan
 * @Time: 2024/05/13
 **/
public class DateUtils {

    /**
     * 推迟日期
     *
     * @param startTime  开始时间
     * @param timeNumber 时间编号，推迟的时间
     * @param timeUnit   时间单位
     * @return {@link Date}
     */

    public static Date postponeDate(Date startTime, Integer timeNumber, TimeUnit timeUnit) {
        long millis = timeUnit.toMillis(timeNumber);
        long endTime = startTime.getTime() + millis;
        return new Date(endTime);
    }

    /**
     * 日期推迟
     * 方法简介:日期推迟,并且转化为字符串类型 yyyy-MM-dd HH:mm:ss
     *
     * @param startTime  开始时间
     * @param timeNumber 时间编号
     * @param timeUnit   时间单位
     * @return {@link String }
     **/
    public static String postponeDateToStr(Date startTime, Integer timeNumber, TimeUnit timeUnit) {
        Date date = postponeDate(startTime, timeNumber, timeUnit);
        return DateUtil.format(date, DatePattern.NORM_DATETIME_PATTERN);
    }

    /**
     * 如果开始时间小于结束时间返回正值 相反 返回负值
     * 相等返回0
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return long
     */
    public static long between(Date startTime, Date endTime) {
        DateBetween dateBetween = DateBetween.create(startTime, endTime, false);
        return dateBetween.between(DateUnit.MS);
    }

    /**
     * 时间到期
     * 如果开始时间在结束时间以前还会false,否则返回true 表示时间到期
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return boolean
     */
    public static boolean isTimeExpires(Date startTime, Date endTime) {
        long between = between(startTime, endTime);
        return between < 0;
    }


    /**
     * 时间没有过期
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return boolean
     **/
    public static boolean isNotTimeExpires(Date startTime, Date endTime) {
        return isTimeExpires(startTime, endTime);
    }
}
